//
//  OriginViewController.m
//
//  Created by 周成龙
//

#import "OriginViewController.h"



@interface OriginViewController ()

@end

@implementation OriginViewController


#pragma mark - LifeCycle
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // ----------------------------消息和函数
    // 消息(OC)
    //NSObject *obj = [NSObject new];
    //[obj performSelector:param1 and:param2];
    
    // 函数(C++)
    //NSObject *obj1 = new NSObject;
    //obj->performSelector(param1, param2)
    
    // 消息结构语言，有运行时决定
    // 函数结构语言有编译器决定
    
    
    
    // ---------------------------- 堆 栈
    NSString *someString = @"someString";
    // Interface type cannot be statically allocated
    // NSString stackString;
    // 类型是NSString *，所有OC的对象都必须这样声明，因为对象所占内存总是分配在堆空间中，而绝对不会分配在栈上，不能在栈上分配OC对象
    
    NSString *anotherString = someString;
    // someString指向堆空间的一块内存，其中含有一个NSString对象，再创建一个对象，令其指向同一地址，那么并不拷贝该对象，只是这两个变量汇通是指向次对象
    // 此时的内存布局：一个分配在堆中的NSString实例，两个分配在栈上的指针指向该实例。
    
    // 分配在堆中的内存必须直接管理，而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。
    
    
    // ---------------------------- 头文件
    // 除非有必要，否则不要引入头文件，一般来说，应在某个类的头文件中使用向前声明(@class)来提及别的类，并在实现文件中引入哪些类的头文件，降低耦合。
    // 有事无法使用向前声明，比如：要在某个类遵循一项协议，这种情况下，尽量吧“该类遵循的某协议”的这条声明移至“class-continuation分类”中，如果不行的话，就把协议单独放在一个头文件中，然后将其引入。
    
    
    // ---------------------------- 字面量
    @1;
    @"string";
    // 数组字面量 ：如果元素有nil，arrayA不会崩溃，arrayB会崩溃，跑出异常
    NSArray *arrayA = [NSArray arrayWithObjects:@"1", @"2", @"3", nil];
    NSArray *arrayB = @[@"1", @"2", @"3"];
    // 字典字面量： 同数组
    NSDictionary *dictA = [NSDictionary dictionaryWithObjectsAndKeys:@"zhou", @"firstName", @"chenglong", @"lastName", @28, @"age", nil];// <对象>, <键>
    NSDictionary *dictB = @{@"firstName" : @"zhou", @"lastName" :@"chenglong", @"age": @28};
    
    NSMutableArray *arrayM = [NSMutableArray arrayWithArray:arrayA];
    arrayM = [arrayB mutableCopy];
    
    [arrayM replaceObjectAtIndex:1 withObject:@"dog"];
    arrayM[1] = @"dog";
    
    // ---------------------------- 多用类型常量，少用#define预处理指令
    #define ANIMATION_DURATION 0.3
    static const NSTimeInterval kAnimationDuration = 0.3;
    
    // .h
    // extern NSString *const kHeaderStringConstant;
    // .m
    // NSString *const kHeaderStringConstant = @"value";
    
    
    // ---------------------------- 枚举
    enum Status {
        StatusNormal,
        StatusSelected
    };
    enum Status st = StatusNormal;
    
    // 可以使用 typedef 简写 enum Status
    typedef enum Status Status;
    Status sta = StatusNormal;
    
    
}


@end
